#ifndef _TEMPORARY_FILE_H_
#define _TEMPORARY_FILE_H_

#include "cardholder_api.h"

// 临时文件大小
#define TEMPORARY_FILE_DATA_LENGTH                  NOMINAL_PACKET_LENGTH

#pragma pack(push, 1)

/**
 * @brief 临时持卡人信息
 *
 */
typedef struct __attribute__((aligned(4)))
{
  uint8_t UserName[USER_NAME_LENGTH]; // 用户名称
  KeyInformation_t KeyInformation;    // 密钥信息
} TempCardholderInformation_t;

/**
 * @brief 临时文件字段内容
 *
 */
typedef struct __attribute__((aligned(4)))
{
  uint32_t FileSize;                              // 文件大小
  uint32_t FileToken;                             // 文件唯一编码
  uint8_t DataPacket[TEMPORARY_FILE_DATA_LENGTH]; // 文件数据
} TemporaryFileFormat_t;

#pragma pack(pop)

/**
 * @brief 删除所有临时文件
 *
 */
extern void DeleteAllTemporaryFile(void);

/**
 * @brief 读取特征值文件
 * 
 * @param ReadAddress - 读取起始地址
 * @param pDataOut    - 读取文件
 * @param SizeOut     - 读取文件大小
 */
extern void ReadTheTemporaryFile(uint32_t ReadAddress, uint8_t *pDataOut, uint16_t SizeOut);

/**
 * @brief 写入特征值文件
 * 
 * @param WriteAddress - 写入起始地址
 * @param pDataIn      - 写入文件
 * @param SizeIn       - 写入文件大小
 * @return bool        - 写入状态（true：成功 false：失败）
 */
extern bool WriteToTemporaryFile(uint32_t WriteAddress, const uint8_t *pDataIn, uint16_t SizeIn);

/**
 * @brief 计算临时文件的累加校验码
 *
 * @param FilzeSize - 文件的大小
 * @return uint8_t  - 计算得到的累加校验码，取低 8 位
 */
extern uint8_t CalculateTemporaryFileCheckCode(uint32_t FilzeSize);

#endif
